#include "../include/User_Operation.h"

// 用户购票根据等级判断折扣，扣减余额并写回本地
void Grade_Judge_Discount_W_file(FlightSystem Flight_sys, U_data log_data, F_node *ptr)
{
    // 根据用户数据判断用户所属链表
    U_list *User_list = By_Data_Judge_List(Flight_sys, log_data);
    // 根据用户数据判断用户所属文件
    const char *User_File = By_User_Judge_File(log_data);
    // 根据用户数据判断用户对应的折扣
    double Discount = By_User_Judge_Discount(log_data);
    // 比较票价与用户余额
    if (ptr->data.value < log_data.value)
    {
        log_data.value = log_data.value - (Discount) * (ptr->data.value);
        (log_data.ticket->leftbuyersa)--;                                  // 座位减一
        S_List_name_delete(User_list, log_data.name);                      // 按名字删除原log.data
        S_List_insert(User_list, log_data, 1);                             // 插入余额更改过的结点
        S_List_File_print(User_list, User_File);                           // 将更改过的余额信息写回本地
        Clear_S_Arr_list(Flight_sys.User_Flight_Infor);                    // 清空用户航班信息
        S_Arr_insert(Flight_sys.User_Flight_Infor, 1, *(log_data.ticket)); // 将当前班次信息插入到用户航班信息顺序表中
        S_Arr_File_print(Flight_sys.User_Flight_Infor, USER_FLIGHT_FILE);  // 将信息写入到文件中
        printf("购票成功,按任意键返回");
        getchar();
        getchar();
    }
    // 余额不足时直接返回主菜单
    else
    {
        puts("余额不足,请尽快充值");
        printf("购票失败,按任意键返回");
        getchar();
        getchar();
        return;
    }
    return;
}

// 用户退票根据等级判断折扣，票价返回用户并写回本地
void Refund_Grade_Judge_Discount_W_file(FlightSystem Flight_sys, U_data log_data, F_node *ptr)
{
    // 根据用户数据判断用户所属链表
    U_list *User_list = By_Data_Judge_List(Flight_sys, log_data);
    // 根据用户数据判断用户所属文件
    const char *User_File = By_User_Judge_File(log_data);
    // 根据用户数据判断用户对应的折扣
    double Discount = By_User_Judge_Discount(log_data);
    // 退票价格返还
    log_data.value = log_data.value + (Discount)*ptr->data.value;
    // 写回本地保存
    S_List_name_delete(User_list, log_data.name); // 按名字删除原log.data
    S_List_insert(User_list, log_data, 1);        // 插入余额更改过的结点
    S_List_File_print(User_list, User_File);      // 将更改过的余额信息写回本地
    puts("退票成功");
    puts("按任意键返回");
    getchar();
    getchar();
}

// 用户购票
void User_ticket_purchase(FlightSystem Flight_sys, U_data log_data)
{
    // 打印航班信息
    D_List_print(Flight_sys.Flight_list);

    puts("航班信息如上");
    puts("请选择你需要购买的班次");

    int id;
    scanf("%d", &id);
    system("clear");
    puts("请核对你的航班信息");
    // 打印用户需要购买的班次信息
    F_node *ptr = D_List_find_id(Flight_sys.Flight_list, id);
    puts("1.确认购买 2.重新购买");
    getchar();
    // 购买成功 标志位置1
    log_data.ticket_flag = 1;

    switch (getchar())
    {
    case '1':
    {
        // 将购买班次的航班信息 写入 用户航班信息顺序表中
        // 写入用户名到顺序表
        strcpy(Flight_sys.User_Flight_Infor->name[0].buf, log_data.name);
        // 写入id
        log_data.ticket->id = ptr->data.id;
        //  写入机型
        strcpy(log_data.ticket->flighttype, ptr->data.flighttype);
        //  写入起点
        strcpy(log_data.ticket->startcity, ptr->data.startcity);
        //  写入终点
        strcpy(log_data.ticket->arrivecity, ptr->data.arrivecity);
        //  写入起飞时间
        log_data.ticket->starttime[0] = ptr->data.starttime[0];
        log_data.ticket->starttime[1] = ptr->data.starttime[1];
        //  写入到达时间
        log_data.ticket->arrivetime[0] = ptr->data.arrivetime[0];
        log_data.ticket->arrivetime[1] = ptr->data.arrivetime[1];
        // 写入飞行时间
        strcpy(log_data.ticket->flytime, ptr->data.flytime);
        //  写入票价
        log_data.ticket->value = ptr->data.value;
        //  写入载客量
        log_data.ticket->maxNUM = ptr->data.maxNUM;
        //  写入剩余座位
        log_data.ticket->leftbuyersa = ptr->data.leftbuyersa;
        ptr->data.leftbuyersa--;
        D_List_file_print(Flight_sys.Flight_list);
        //  写入是否起飞
        log_data.ticket->whetherfly = ptr->data.whetherfly;
        // 用户购票根据等级判断折扣，扣减余额并写回本地
        Grade_Judge_Discount_W_file(Flight_sys, log_data, ptr);
    }
    break;

    default:
        break;
    }
}

// 遍历当前用户订单
void Iterate_current_user(S_arr_list *L, U_data data)
{
    for (int i = 0; i < L->len; i++)
    {
        if (0 == strcmp(L->name[i].buf, data.name))
        {
            puts("你的订单信息如下");
            printf("用户名:%s\t班次:%d\t机型:%s\t起点站:%s\t终点站:%s\t起飞时间:%02d:%02d\t到达时间:%02d:%02d\t飞行时间:%s\t票价:%d\t载客量:%d\t剩余座位:%d\t是否飞:%c\n",
                   L->name[i].buf, L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
                   L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
                   L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
        }
    }
    return;
}

// 用户退票
void User_refund_ticket(FlightSystem Flight_sys, U_data log_data)
{
    // 从文件中读取所有用户订单
    S_Arr_File_scanf(Flight_sys.User_Flight_Infor, USER_FLIGHT_FILE);
    // 遍历当前用户订单
    Iterate_current_user(Flight_sys.User_Flight_Infor, log_data);
    puts("请选择你要退票的班次");
    int id;
    scanf("%d", &id);
    // 遍历用户航班信息表
    for (int i = 0; i < Flight_sys.User_Flight_Infor->len; i++)
    {

        // 当前用户与输入退票班次都相等时 删除此项信息
        if ((Flight_sys.User_Flight_Infor->data[i].id == id) && (0 == strcmp(log_data.name, Flight_sys.User_Flight_Infor->name[i].buf)))
        {
            S_Arr_delete(Flight_sys.User_Flight_Infor, i + 1);
        }
    }
    // 将更新后的顺序表重新导入本地
    S_Arr_W_File_print(Flight_sys.User_Flight_Infor, USER_FLIGHT_FILE); // 向文件覆盖写入用户航班信息顺序表
    // 读取航班信息，在航班信息中查找输入的班次
    F_node *ptr = D_List_find_id(Flight_sys.Flight_list, id);
    // 对应班次座位加一
    (ptr->data.leftbuyersa)++;
    // 写回航班信息
    D_List_file_print(Flight_sys.Flight_list);
    Refund_Grade_Judge_Discount_W_file(Flight_sys, log_data, ptr);
}

// 更改等级，在原文件中删除，并添加入对应的文件
void Change_Grage_Delete_w_Flie(FlightSystem Flight_sys, U_data data, int grage)
{
    // 根据用户等级判断用户所属链表
    U_list *User_list = By_Data_Judge_List(Flight_sys, data);
    // 根据用户等级判断用户所属文件
    const char *User_File = By_User_Judge_File(data);
    // 保存原来数据
    U_data new_data = data;
    // 按名字删除原结点
    S_List_name_delete(User_list, data.name);
    // 将更改后的数据写回本地
    S_List_File_print(User_list, User_File);
    // 身份码更改
    new_data.grade = grage;
    // 根据用身份码判断用户所属链表
    U_list *new_list = By_Data_Judge_List(Flight_sys, new_data);
    // 根据身份码判断用户所属文件
    const char *new_File = By_User_Judge_File(new_data);
    // 将更改后的结点插入对应的用户链表中
    S_List_insert(new_list, new_data, 1);
    // 将更改后的文件写回本地
    S_List_File_print(new_list, new_File);
}

// 检查当前用户，如果余额满足条件，就自动升级为相应等级的用户
void By_User_money_Judge_Grage(FlightSystem Flight_sys, U_data data)
{

    if ((data.value >= 10000) && (data.grade < GRADE_SILVER))
    {
        Change_Grage_Delete_w_Flie(Flight_sys, data, GRADE_SILVER);
        puts("恭喜你已成为白银会员,购票享受九折优惠");
        getchar();
        Press_Enter_To_Continue();
    }
    if ((data.value >= 15000) && (data.grade < GRADE_GOLD))
    {
        Change_Grage_Delete_w_Flie(Flight_sys, data, GRADE_GOLD);
        puts("恭喜你已成为黄金会员,购票享受八折优惠");
        getchar();
        Press_Enter_To_Continue();
    }
    if ((data.value >= 20000) && (data.grade < GRADE_PLATINUM))
    {
        Change_Grage_Delete_w_Flie(Flight_sys, data, GRADE_PLATINUM);
        puts("恭喜你已成为铂金会员,购票享受七折优惠");
        getchar();
        Press_Enter_To_Continue();
        return;
    }
    return ;
}

// 余额充值
void Balance_Recharge(FlightSystem Flight_sys, U_data data)
{
    // 通过数据确定是那一条，通过名字在这条表上面找到结点
    U_node *find_data = S_List_find_name(By_Data_Judge_List(Flight_sys, data), data.name);
    printf("当前用户:%s 余额:%d\n", find_data->data.name, find_data->data.value);

    printf("请输入你要充值的余额\n");
    int value;
    scanf("%d", &value);
    find_data->data.value += value;
    U_list *L = By_Data_Judge_List(Flight_sys, data);
    S_List_print(L);
    printf("添加成功\n");
    printf("当前用户:%s 余额:%d\n", find_data->data.name, find_data->data.value);
    // By_User_money_Judge_Grage(Flight_sys, data);
    char const *File = By_User_Judge_File(data); // 通过当前数据确定是哪个用户文件
    S_List_File_print(L, File);                  // 将更改过的余额信息写回本地
    getchar();
    Press_Enter_To_Continue();
}

// 查看航班
void Check_Flight(F_list *list)
{
    // 遍历航班信息
    D_List_print(list);
}

// 修改密码
void Change_Password(FlightSystem Flight_sys, U_data data)
{
    // 通过数据确定是那一条，通过名字在这条表上面找到结点
    U_node *find_data = S_List_find_name(By_Data_Judge_List(Flight_sys, data), data.name);
    printf("当前用户:%s 密码:%s\n", find_data->data.name, find_data->data.passwd);

    printf("请输入你要修改的密码\n");
    scanf("%s", find_data->data.passwd);
    printf("修改成功\n");
    printf("当前用户:%s 密码:%s\n", find_data->data.name, find_data->data.passwd);
    U_list *L = By_Data_Judge_List(Flight_sys, data);
    char const *File = By_User_Judge_File(data); // 通过当前数据确定是哪个用户文件
    S_List_File_print(L, File);                  // 将更改过的密码信息写回本地
    getchar();
    Press_Enter_To_Continue();
}

// 查看订单
void Check_indent(FlightSystem Flight_sys, U_data data)
{
    // 从文件中读取所有用户订单
    S_Arr_File_scanf(Flight_sys.User_Flight_Infor, USER_FLIGHT_FILE);
    // 遍历当前用户订单
    Iterate_current_user(Flight_sys.User_Flight_Infor, data);
    Press_Enter_To_Continue();
}